#ifndef _MATRIX_H
#define _MATRIX_H

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cmath>

class Matrix        //矩阵类
{
public:
    Matrix(int _row, int __col, int cvalue);        //创建一个全部元素均为cvalue的矩阵
    Matrix(const Matrix &a);        //拷贝构造函数
    Matrix(int _row, int _col, double *p);      //将矩阵的所有元素按顺序存放在数组p中，依此创建矩阵
    ~Matrix();      //析构函数
    void show();        //显示矩阵
    Matrix idown();     //取出该矩阵下三角的所有元素，其中对角线全部修改为1
    Matrix down();      //取出该矩阵下三角的所有元素
    Matrix downarc();       //对下三角矩阵求逆
    Matrix arc();       //对矩阵求逆
    Matrix diag();      //取出该矩阵主对角线的所有元素
    Matrix cut(int rowbegin, int rowend, int colbegin, int colend);     //取出矩阵的一个切片
    double norm1();     //求矩阵的1范数
    double norm0();     //求矩阵的无穷范数
    double norm();      //求矩阵的2范数
    int row;        //矩阵的行数
    int col;        //矩阵的列数
    double *datap;      //矩阵的所有元素，按顺序存放在一个一维数组中。
    friend Matrix operator*(const Matrix &a, double b);     //矩阵乘常数（注意常数必须作为乘数而不能作为被乘数）
    friend Matrix operator*(const Matrix &a, const Matrix &b);      //矩阵乘法
    Matrix operator=(const Matrix &a);      //矩阵赋值
    Matrix operator+(const Matrix &a);      //矩阵加法
    Matrix operator-(const Matrix &a);      //矩阵减法
    void trans();     //矩阵转置（该转置会改变原矩阵）

};

double vnorm(Matrix x);     //求向量的2范数
Matrix ones(int n);     //创建一个n维的单位矩阵
Matrix ones(int m, int n);      //创建一个m行n列的单位矩阵
Matrix diag(int n, double *p);      //创建一个n维的主对角线元素储存在数组p中的矩阵
Matrix trans(Matrix a);     //矩阵转置（该转置返回一个新矩阵，不会改变原矩阵

#endif